package services

import (
	"blog-backend/internal/app/dtos"
	"blog-backend/internal/app/models"
	"blog-backend/internal/app/repositories"
	"errors"
)

type CommentService struct {
	commentRepo *repositories.CommentRepository
	postRepo    *repositories.PostRepository
}

func NewCommentService() *CommentService {
	return &CommentService{
		commentRepo: repositories.NewCommentRepository(),
		postRepo:    repositories.NewPostRepository(),
	}
}

// GetCommentsByPost 获取文章评论
func (s *CommentService) GetCommentsByPost(postID uint) ([]models.Comment, error) {
	// 检查文章是否存在
	if !s.postRepo.Exists(postID) {
		return nil, errors.New("文章不存在")
	}
	
	return s.commentRepo.GetByPostID(postID)
}

// CreateComment 创建评论
func (s *CommentService) CreateComment(postID, userID uint, dto dtos.CreateCommentDto) (*models.Comment, error) {
	// 检查文章是否存在
	if !s.postRepo.Exists(postID) {
		return nil, errors.New("文章不存在")
	}
	
	// 验证评论内容
	if dto.Content == "" {
		return nil, errors.New("评论内容不能为空")
	}
	
	comment := &models.Comment{
		PostID:  postID,
		Content: dto.Content,
	}
	
	// 设置评论者信息
	if userID != 0 {
		// 登录用户评论
		comment.UserID = &userID
	} else {
		// 游客评论
		if dto.Author == "" {
			return nil, errors.New("请提供评论者名称")
		}
		if dto.Email == "" {
			return nil, errors.New("请提供评论者邮箱")
		}
		comment.Author = dto.Author
		comment.Email = dto.Email
	}
	
	// 设置父评论
	if dto.ParentID != nil && *dto.ParentID != 0 {
		parentComment, err := s.commentRepo.GetByID(*dto.ParentID)
		if err != nil {
			return nil, errors.New("父评论不存在")
		}
		if parentComment.PostID != postID {
			return nil, errors.New("父评论不属于该文章")
		}
		comment.ParentID = dto.ParentID
	}
	
	// 默认状态为待审核（如果是登录用户则直接发布）
	if userID != 0 {
		comment.Status = 1 // 已发布
	} else {
		comment.Status = 0 // 待审核
	}
	
	if err := s.commentRepo.Create(comment); err != nil {
		return nil, errors.New("创建评论失败")
	}
	
	return comment, nil
}

// DeleteComment 删除评论
func (s *CommentService) DeleteComment(commentID, userID uint) error {
	comment, err := s.commentRepo.GetByID(commentID)
	if err != nil {
		return errors.New("评论不存在")
	}
	
	// 检查用户是否有权限删除
	if comment.UserID == nil || *comment.UserID != userID {
		return errors.New("无权删除此评论")
	}
	
	if err := s.commentRepo.Delete(commentID); err != nil {
		return errors.New("删除评论失败")
	}
	
	return nil
}

// ApproveComment 审核评论（管理员）
func (s *CommentService) ApproveComment(commentID uint) error {
	comment, err := s.commentRepo.GetByID(commentID)
	if err != nil {
		return errors.New("评论不存在")
	}
	
	if comment.Status != 0 {
		return errors.New("评论已审核")
	}
	
	comment.Status = 1 // 设置为已发布
	if err := s.commentRepo.Update(comment); err != nil {
		return errors.New("审核评论失败")
	}
	
	return nil
}